package com.gengzp.mq.client.core;

import com.gengzp.mq.client.enums.MqMessageStatusEnum;
import com.gengzp.mq.client.model.generic.MqPaginationResult;
import com.gengzp.mq.client.model.message.MqMessage;
import com.gengzp.mq.client.model.message.MqPageMessageResp;
import com.gengzp.mq.client.model.topic.MqTopicResp;

import java.util.List;

/**
 * @ClassName MqCoreFunc
 * @Description mq核心方法接口
 * @Author gengzp
 * @Date 2025/9/4 17:52
 */
public interface MqCoreFunc {

    /**
     * 创建主题
     *
     * @param topicName   主题名
     * @param description 主题描述
     */
    void createTopic(String topicName, String description);

    /**
     * 编辑主题描述
     *
     * @param topicName   主题名
     * @param description 主题描述
     */
    void editTopicDescription(String topicName, String description);

    /**
     * 删除主题
     *
     * @param topicName 主题名
     */
    void removeTopic(String topicName);

    /**
     * 查询全部主题列表
     *
     * @return 主题列表
     */
    List<MqTopicResp> searchAllTopic();

    /**
     * 发送消息
     *
     * @param topic   主题
     * @param tag     标签
     * @param content 消息内容
     * @return 消息id
     */
    String sendMessage(String topic, String tag, String content);

    /**
     * 重发消息
     *
     * @param messageId 消息唯一标识
     */
    void resendMessage(String messageId);

    /**
     * 订阅主题
     *
     * @param topic 主题
     * @return 消息
     */
    MqMessage subscribe(String topic) throws Exception;

    /**
     * 消息确认
     *
     * @param messageId 消息id
     */
    void ackMessage(String messageId) throws Exception;

    /**
     * 分页查询消息
     *
     * @param pageNum           页码
     * @param pageSize          每页数据条数
     * @param messageId         消息id
     * @param topic             主题
     * @param messageStatusEnum 消息状态枚举
     * @return 分页查询结果
     */
    MqPaginationResult<MqPageMessageResp> pageQueryMessage(int pageNum,
                                                           int pageSize,
                                                           String messageId,
                                                           String topic,
                                                           MqMessageStatusEnum messageStatusEnum);

}
